package siafi.util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.StringTokenizer;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.axis2.databinding.types.soapencoding.Array;


import siafi.bean.Concepto;
import siafi.bean.ListaServicios;
import siafi.bean.Servicio;
import siafi.db.TerceroDAO;
import util.Encrypt;

@ManagedBean(name = "adminController")
@SessionScoped

public class Administracion {
	
	private String usuario;
    private String password;
    
    private boolean autEst = false;
    private boolean aut = false;
    private boolean admin = false;
    private boolean serv = false;
    
    private String texto;   
    private String ip;
    
    private String cElgido = null;
    private UIInput conceptoElegido;
    
    private List<Concepto> conceptos = null;
    private List<Servicio> servicios = null;
    private List<String> serviciosElegidos;
    private List<String> serviciosGuardados;
    private List<String> serviciosTotales;
    private List<String>centroServicios = null;
    
    
    static final String USR = "complementarioAdmin";
    static final String PWD = "p3d4g0g1c4";
   
    
  //AUTENTICACIÓN MEDIANTE WEB SERVICE
   /* public String ingreso(){
    	LoginWLProxy lProxy = new LoginWLProxy();
    	lProxy.setEndpoint("http://dgsi-aplica.pedagogica.edu.co:8090/loginLiveEdu/loginWLService");
    	if (usuario != null && !"".equals(usuario) && password != null && !"".equals(password)){
            try {
            	System.out.println("datos ingresados: " + usuario + " - " + password);
                String[] dat = Encrypt.encrip(usuario, password);
               aut = lProxy.auth_enc(dat[0], dat[1]);  
            } catch (Exception ex) {
                Logger.getLogger(Administracion.class.getName()).log(Level.SEVERE, null, ex);
                ex.printStackTrace();
            }    
        } else {
            System.out.println("Debe ingresar el correo y la contraseña");
            //JsfUtil.addErrorMessage("Debe ingresar el correo y la contraseña");
            return null;
        }
    	if (aut) {
            HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
            System.out.println("usuario ingresado: " + usuario + " - IP: " +  origRequest.getRemoteAddr());
            //System.out.println("usuario ingresado: " + login + " - IP: " + origRequest.getLocalAddr() + " - " +  origRequest.getRemoteAddr());
            return "consulta";
        } else {
        	System.out.println("Correo y/o contraseña incorrecta");
            //JsfUtil.addErrorMessage("Correo y/o contraseña incorrecta");
            return null;
        }
    	//return null;
    }*/
    
	public String getUsuario() {
		return usuario;
	}
	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public boolean isAut() {
		return aut;
	}
	public void setAut(boolean aut) {
		this.aut = aut;
	}
	public String getTexto() {
		return texto;
	}
	public void setTexto(String texto) {
		this.texto = texto;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	
	public void ingresoEstud() throws IOException{	
		setAut(false);		
		setAdmin(false);
		autEst = true;
		FacesContext.getCurrentInstance().getExternalContext().redirect("indexServicio.jsp");
		
		HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
		HttpSession session = req.getSession(true);
		//assign the session variable to a value.
		session.removeAttribute("aut");
		session.setAttribute("autEst", autEst);
		
		session.setAttribute("servGuar", findGuardados());
	}
	
	public void ingreso() throws IOException, NoSuchAlgorithmException{
		setAut(false);		
		setAdmin(false);
		autEst = false;
		if (usuario != null || !usuario.isEmpty()){
			if (password != null || !password.isEmpty()){				
				ValidarPwd vPwd = new ValidarPwd();		                 
				setAut(vPwd.validar(usuario, password));
					
				if (aut) {			
					//System.out.println("si conectó");
					if (usuario.equals("administrator")){
						//leerArchivo();
						setAdmin(true);
					} else{
						FacesContext.getCurrentInstance().getExternalContext().redirect("indexServicio.jsp");
						setAdmin(false);
					}
					
					HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
					//HttpServletResponse res = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
					HttpSession session = req.getSession(true);
					//assign the session variable to a value.
					session.removeAttribute("aut");
					session.setAttribute("aut", aut);
				}else {					
					System.out.println("Usuario y/o contraseña incorrectos");					
				}	
			}else{			
				setAut(false);
				setAdmin(false);
				System.out.println("falta contraseña");
			}	
		}else{			
			setAut(false);
			setAdmin(false);
			System.out.println("falta usuario");
		}	 
	}
	public void cLenguas() throws IOException{
		findRecibos("2217301");
	}
	
	public void sAcademicos() throws IOException{
		findRecibos("2217302");
	}
	
	public void sAdministrativos() throws IOException{
		findRecibos("2217303");
	}
	
	public void eLab() throws IOException{
		findRecibos("2217304");
	}
	
	public void inscripciones() throws IOException{
		findRecibos("2217305");
	}
	
	public void ipn() throws IOException{
		findRecibos("2217306");
	}
	/*	2217301 - CENTRO DE LENGUAS
 		2217302 - SERVICIOS ACADÉMICOS
 		2217303 - SERVICIOS ADMINISTRATIVOS
 		2217304 - EXAMENES DE LABORATORIO
 		2217305 - INSCRIPCIONES
 		2217306 - INSTITUTO PEDAGOGICO NACIONAL
	 * */
	/*public List<Concepto> findConceptos(){		
		setConceptos(new ArrayList<Concepto>());
		try {
			getConceptos().addAll(TerceroDAO.findConceptos());
			//System.out.println("Tamaño Conceptos: " + getConceptos().size());
		}catch (Exception e){
			setConceptos(new ArrayList<Concepto>());
		}
		return getConceptos();
	}
	
	public Collection<SelectItem> getLsConceptos() {
		List<SelectItem> lsConceptos = new ArrayList<SelectItem>();
		List<Concepto> conceptos2 = new ArrayList<Concepto>();
		conceptos2 = findConceptos();
		try {
			for (Concepto c : conceptos2){
				lsConceptos.add(new SelectItem(c.getCod_concepto(), c.getNom_concepto()));
			}

		} catch (Exception e) {
			e.getCause();
		}
		return lsConceptos;
		
	}
	
	public void elegido(){
		setServ(false);		
		findRecibos(conceptoElegido.getValue().toString());		
	}*/
		
	public void findRecibos(String cod) throws IOException{
		leerArchivo();
		servicios = new ArrayList<Servicio>();
		servicios.addAll(TerceroDAO.findServicioGrilla(cod, "161002"));//161001		
		if (servicios.size()>0){
			setServ(true);
			if (serviciosGuardados.size()>0){
				for (String sG : serviciosGuardados){
					for (Servicio s : servicios){
						if (sG.equals(s.getConcepto())){
							serviciosElegidos.add(sG);							
						}				
					}					
				}
				serviciosGuardados.removeAll(serviciosElegidos);
			}
		}
	}
	
	public List<String> getLsServicios() {
		List<String> lsServicios = new ArrayList<String>();
		try {
			for (Servicio s : servicios){
				lsServicios.add(s.getConcepto());				
			}
			/*if (serviciosElegidos.size()>0){
				serviciosGuardados.addAll(serviciosElegidos);
				
			}
			
			centroServicios = new ArrayList<String>();
			for (String s : lsServicios){				
				centroServicios.add(s);
				}*/			
		} catch (Exception e) {
			e.getCause();
		}
		
		return lsServicios;
		
	}
	
	public void adminServicios () throws IOException{
		File file1 = new File("serviciosCompl.txt");
        file1.createNewFile();
        System.err.println("ruta archivo: "+file1.getAbsolutePath());
        BufferedWriter out = new BufferedWriter(new FileWriter(file1, false));
        serviciosGuardados.addAll(serviciosElegidos);
        for (String s : serviciosGuardados){
        	out.write(s);
        	out.newLine();            
        }
        out.close();
		/*for (String s : serviciosElegidos)
			System.out.println("Servicios elegidos: " + s);
		for (String s : serviciosGuardados)
			System.out.println("Servicios Guardados: " + s);*/
	}
	
	public void leerArchivo() throws IOException{
		File fileP = new File("serviciosCompl.txt");
        //System.err.println(fileP.getAbsolutePath());
        FileReader fr = new FileReader(fileP);
        BufferedReader br = new BufferedReader(fr);
        String lineas = "";        
        serviciosElegidos = new ArrayList<String>();
        serviciosTotales = new ArrayList<String>();
        serviciosGuardados = new ArrayList<String>();
        while ((lineas = br.readLine()) != null){
           serviciosGuardados.add(lineas); 
        }
        /*conceptos = new ArrayList<Concepto>();
        conceptos.addAll(TerceroDAO.findConceptos());
        for (Concepto c : conceptos){
			System.out.println("Concepto: " + c.getCod_concepto() + " - " + c.getNom_concepto());
		}*/
	}
	
	public List<String> findGuardados() throws IOException{
		leerArchivo();
		return serviciosGuardados;
	}
	
	public void logout() throws IOException{
		HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
		HttpSession session = req.getSession(true);
		//assign the session variable to a value.
		session.setAttribute("aut", false);
		session.invalidate();
		FacesContext.getCurrentInstance().getExternalContext().redirect("index.xhtml");
		
	}
	public boolean isAdmin() {
		return admin;
	}
	public void setAdmin(boolean admin) {
		this.admin = admin;
	}
	public List<Servicio> getServicios() {
		return servicios;
	}
	public void setServicios(List<Servicio> servicios) {
		this.servicios = servicios;
	}
	public List<String> getServiciosElegidos() {
		return serviciosElegidos;
	}
	public void setServiciosElegidos(List<String> serviciosElegidos) {
		this.serviciosElegidos = serviciosElegidos;
	}
	public List<String> getCentroServicios() {
		return centroServicios;
	}
	public void setCentroServicios(List<String> centroServicios) {
		this.centroServicios = centroServicios;
	}
	public List<Concepto> getConceptos() {
		return conceptos;
	}
	public void setConceptos(List<Concepto> conceptos) {
		this.conceptos = conceptos;
	}
	public String getcElgido() {
		return cElgido;
	}
	public void setcElgido(String cElgido) {
		this.cElgido = cElgido;
	}
	public UIInput getConceptoElegido() {
		return conceptoElegido;
	}
	public void setConceptoElegido(UIInput conceptoElegido) {
		this.conceptoElegido = conceptoElegido;
	}
	public boolean isServ() {
		return serv;
	}
	public void setServ(boolean serv) {
		this.serv = serv;
	}
	public boolean isAutEst() {
		return autEst;
	}
	public void setAutEst(boolean autEst) {
		this.autEst = autEst;
	}
	public List<String> getServiciosGuardados() {
		return serviciosGuardados;
	}
	public void setServiciosGuardados(List<String> serviciosGuardados) {
		this.serviciosGuardados = serviciosGuardados;
	}
	public List<String> getServiciosTotales() {
		return serviciosTotales;
	}
	public void setServiciosTotales(List<String> serviciosTotales) {
		this.serviciosTotales = serviciosTotales;
	}
	
	}
